iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0

在上一章我們提到的goroutine,在使用go指令後會額外開一個線程去處理,
不過因為該線程處理完後就會自行關閉,假如有需要回收的變數或結果,會比較麻煩,
一個方式是使用全域變數去收集,不過這樣有可能有變數污染的情況發生,
另一個方法就是使用通道(channel)來收集。

Channel

建立channel的方式,可以使用make指令:

    c := make(chan int)

透過這種方式,就可以建立一個整數的channel,
而要使用這個channel,則需要接收端(receiver)跟發送端(sender)

    var testInt int
    c := make(chan int)
    c <- 123
    testInt := <- c
    fmt.Println(testInt)

上面程式碼是將整數123放入channel c內,
並在下面接收整數123放到testInt內
不過直接用上面這段程式碼去運行,compiler會出現死鎖(dead lock)的情況,
因為當執行完放入123之後,發送端會進入ready的狀態,這時就會卡住,
而執行不到接收端,因此我們需要改成這樣:

	var val int
	c := make(chan int)       
	go func() { c <- 123 }() 
	testInt = <-c                   
	fmt.Println(testInt)

將發送端放入goroutine內,這樣接收端就可以正常收到訊息並處理了。

用於函數

基本的使用說完了,讓我們回到我們的服務:

func getUserDataAndUpdate(userID int64, c chan user){
    .....
}

上面的函數是取得使用者資料更新後並回傳,透過上面將channel帶入的方式,
就可以在goroutine內取得處理完的資料了:

func main() {
	var val user
	s := make(chan user)     
	go getUserDataAndUpdate(123, s)
	val = <-s 
	fmt.Println(val)
}

透過這種方式,可以將某些可並行處理的資料分散到goroutine去進行,並在最後透過channel回收回來,
減少處理時間,提升使用者體驗,畢竟沒人想要查個資料就等個3到5秒。


上一篇
Day19-平行處理 goroutine
下一篇
Day21-Grpc
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言